#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , fileName("")
    , filePath("")
    , file(nullptr)
{
    ui->setupUi(this);

    socket = new QTcpSocket(this);

    ui->lineEditPort->setText("6789");
    ui->lineEditIPAddress->setText("192.168.8.4");
    ui->pushButtonDowload->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 将配置信号与槽的代码块集中
void MainWindow::socketConnect()
{
    // 连接服务器成功的信号处理
    connect(socket, &QTcpSocket::connected, this,
            [this]{
        ui->pushButtonConnect->setEnabled(false);
        ui->pushButtonDowload->setEnabled(true);
    });

    // 服务器断开连接的信号处理
    connect(socket, &QTcpSocket::disconnected, this,
            [this]{
        ui->pushButtonDowload->setEnabled(false);
        ui->pushButtonConnect->setEnabled(true);
        QMessageBox::information(this, "不好", "服务器出现了意外！");
    });

    // 从服务器收到信息的信号处理
    connect(socket, &QTcpSocket::readyRead, this, &MainWindow::dealDataFromServer);
}

// 处理来自服务器的信息
void MainWindow::dealDataFromServer()
{
    while (socket->bytesAvailable() > 0) {
        if(isLoad){
            qDebug() << "收到了文件数据";
            // 接收文件的函数
            copyDatatoLocal(socket->readAll());
            continue;
        }

        QString msg = QString::fromUtf8(socket->readAll());
        qDebug() << msg.size();
        qDebug() << msg;

        if (!msg.isEmpty()) {
            if(msg[0] == '1'){
                QString trueMsg = msg.mid(1);
                showDownloadItem(trueMsg);
            }else if(msg[0] == '0'){
                QMessageBox::information(this, "无奈", "服务器没有找到这个文件！");
                return ;
            }else if(msg[0] == '8'){
//                qDebug() << "准备下载";
//                isLoad = true;
            }else if(msg[0] == '6'){
                // 文件传输完毕
                qDebug() << "接收完毕";
                isLoad = false;
                if (file != nullptr) {
                    file->close();
                    file = nullptr;
                }
                int max = ui->progressBarDowload->maximum();
                ui->progressBarDowload->setValue(max);
            }
        }
    }
}

// 展示可下载文件到组件
void MainWindow::showDownloadItem(QString items)
{
    ui->listWidgetDowloadItemList->clear();
    // 按 $ 分割字符串
    QStringList fileEntries = items.split('$', Qt::SkipEmptyParts);

    // 遍历每个文件条目
    for (const QString &entry : fileEntries) {
        // 按 , 分割文件名称和大小
        QStringList parts = entry.split(',');
        if (parts.size() == 2) {
            fileName = parts[0];
            QString fileSize = parts[1];
            // 组合文件名称和大小信息
            QString displayText = QString("%1\t|\t%2 字节").arg(fileName).arg(fileSize);
            // 将信息添加到 QListWidget 中
            ui->listWidgetDowloadItemList->addItem(displayText);
        }
    }
}

// 服务器传输来的信息下载到本地
void MainWindow::copyDatatoLocal(QByteArray data)
{
    qDebug() << "开始下载";
    if(file == nullptr) {
        file = new QFile(filePath + "/" + fileName);
        // 只写打开所以没有会新建
        if(!file->open(QIODevice::ReadWrite)){
            qDebug() << "不可抗力导致打开失败";
            return ;
        }
    }

    file->write(data);

    int val = ui->progressBarDowload->value();
    val += data.size();
    ui->progressBarDowload->setValue(val);
    qDebug() << val << ":" << ui->progressBarDowload->maximum() << ":" << ui->progressBarDowload->value();
    qDebug() << "写入成功";
    if(ui->progressBarDowload->value() >= ui->progressBarDowload->maximum()){
        qDebug() << "传输结束";
        isLoad = false;
        if (file != nullptr) {
            file->close();
            file = nullptr;
        }
        int max = ui->progressBarDowload->maximum();
        ui->progressBarDowload->setValue(max);
    }
}

// 点击连接按钮的监听事件
void MainWindow::on_pushButtonConnect_clicked()
{
    QString ipAddress = ui->lineEditIPAddress->text();
    QString port = ui->lineEditPort->text();
    if(ipAddress == nullptr || port == nullptr){
        QMessageBox::information(this, "注意", "请确保ip和port都已经填写！");
        return ;
    }

    // 连接服务器
    socket->connectToHost(QHostAddress(ipAddress), port.toUInt());

    socketConnect();
}

// 点击下载按钮的监听事件
void MainWindow::on_pushButtonDowload_clicked()
{
    QString tempPath = QFileDialog::getExistingDirectory();
    if(tempPath == nullptr){
        QMessageBox::information(this, "注意", "你需要选择一个文件夹才行！");
        return ;
    }

    filePath = tempPath;

    // 封装后的字符串
    QString encapsulatedStr = ui->listWidgetDowloadItemList->currentItem()->text();

    // 按分隔符分割字符串
    QStringList parts = encapsulatedStr.split("\t|\t");
    if (parts.size() == 2) {
        fileName = parts[0];
        QString sizeStr = parts[1].remove(" 字节");

        // 设置进度条的最大值
        ui->progressBarDowload->setMaximum(sizeStr.toUInt());
        socket->write(fileName.toUtf8());

        isLoad = true;
        qDebug() << "准备接收文件";
    }
}
